package com.appspot.abcensys.client;

import java.util.ArrayList;
import java.util.logging.Logger;

import com.appspot.abcensys.shared.GebruikerInstelling;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;

/**
 * Stelt een docent instaat zijn Instellingen te wijzigen
 * 
 * @author Hugo Zonderland
 */
public class GebruikerInstellingWijzigen {

	// Serice
	private AbcensysServiceAsync service = (AbcensysServiceAsync) GWT.create(AbcensysService.class);

	// FlexTable
	private FlexTable flxTableHeader, flxTable;
	
	// CheckBox
	private CheckBox chkEmailPerAfmelding;
	
	// CheckBox
	private CheckBox chkEmailPerDag;
	
	// CheckBox
	private CheckBox chkEmailPerWeek;
	
	// CheckBox
	private CheckBox chkEmailPerMaand;

	// Row couter
	int row = 0;

	// Logger
	private static final Logger log = Logger.getLogger(GebruikerInstellingWijzigen.class.getName());

	/**
	 * Constructor
	 */
	public GebruikerInstellingWijzigen() {

		Abcensys.setLoadingImage(true);

		// Row init
		row = 0;

		// Headertable aanmaken
		flxTableHeader = new FlexTable();
		flxTableHeader.setCellPadding(0);
		flxTableHeader.setCellSpacing(3);
		flxTableHeader.setWidth("900px");
		flxTableHeader.setStyleName("datatable");

		// Link Widget
		HTML linkWidget = new HTML("Je bent nu hier: Abcensys &raquo; Instellingen");
		linkWidget.setStyleName("lblLink");
		flxTableHeader.setWidget(row, 0, linkWidget);
		row++;

		// Image
		Image imgMijnAfwezigheid = new Image();
		imgMijnAfwezigheid.setAltText("Instelling");
		imgMijnAfwezigheid.setUrl("style/icon/monitor_edit.png");

		// Header
		HTML h1 = new HTML("<h1> " + imgMijnAfwezigheid.toString() + " Instellingen</h1>");
		flxTableHeader.setWidget(row, 0, h1);
		
		// Row reset
		row = 0;
		
		// Datatable aanmaken
		flxTable = new FlexTable();
		flxTable.setCellPadding(0);
		flxTable.setCellSpacing(3);
		flxTable.setWidth("900px");
		flxTable.setStyleName("datatable");

		service.getGebruikerInstelling(new AsyncCallback<GebruikerInstelling>() {
			public void onFailure(Throwable caught) {
				Window.alert("Er ging iets fout tijdens het ophalen van de gegevens. Probeer het later nog een keer.");
				log.info("Service failure -> getGebruikerInstelling -> " + caught.getMessage());
			}

			public void onSuccess(GebruikerInstelling instelling) {
				showInstellingenWijzigenForm(instelling);
			}
		});
	}

	/**
	 * Een prive functie om het overzichtelijk te houden en niet door te werken
	 * in de onSuccess
	 * 
	 * @param GebruikerInstelling
	 *            met de instellingen van de gebruiker
	 */
	private void showInstellingenWijzigenForm(GebruikerInstelling instelling) {

		// Introductie tekst
		flxTable.setWidget(row, 0, new Label("Hier kan u verschillende instellingen wijzigen. Bijvoorbeeld of u afmeldingen van leerlingen voor uw les via de email wilt ontvangen."));
		row++;

		// Email per Afmelding ontvangne
		Label lblEmailPerAfmelding = new Label("Email per afmelding:");
		chkEmailPerAfmelding = new CheckBox();
		if (instelling != null) {
			chkEmailPerAfmelding.setValue(instelling.isEmailPerAfmelding());
		}

		flxTable.setWidget(row, 0, lblEmailPerAfmelding);
		flxTable.setWidget(row, 1, chkEmailPerAfmelding);
		row++;

		// Email met afmeldingen per dag ontvangen
		Label lblEmailPerDag = new Label("Email per dag:");
		chkEmailPerDag = new CheckBox();
		if (instelling != null) {
			chkEmailPerDag.setValue(instelling.isEmailPerDag());
		}

		flxTable.setWidget(row, 0, lblEmailPerDag);
		flxTable.setWidget(row, 1, chkEmailPerDag);
		row++;

		// Email met afmeldingen per week ontvangen
		Label lblEmailPerWeek = new Label("Email per week");
		chkEmailPerWeek = new CheckBox();
		if (instelling != null) {
			chkEmailPerWeek.setValue(instelling.isEmailPerWeek());
		}

		flxTable.setWidget(row, 0, lblEmailPerWeek);
		flxTable.setWidget(row, 1, chkEmailPerWeek);
		row++;

		// Email met afmeldingen per maand ontvangen
		Label lblEmailPerMaand = new Label("Email per maand:");
		chkEmailPerMaand = new CheckBox();
		if (instelling != null) {
			chkEmailPerMaand.setValue(instelling.isEmailPerMaand());
		}

		flxTable.setWidget(row, 0, lblEmailPerMaand);
		flxTable.setWidget(row, 1, chkEmailPerMaand);
		row++;

		// Opslaan button
		Image imgTick = new Image();
		imgTick.setAltText("Sla wijzigingen op");
		imgTick.setUrl("style/icon/tick.png");

		Button btnSubmit = new Button("Sla wijzigingen op " + imgTick.toString());
		btnSubmit.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {

				boolean perAfmelding = chkEmailPerAfmelding.getValue();
				boolean perDag = chkEmailPerDag.getValue();
				boolean perWeek = chkEmailPerWeek.getValue();
				boolean perMaand = chkEmailPerMaand.getValue();

				final ArrayList<Boolean> instellingen = new ArrayList<Boolean>();
				instellingen.add(perAfmelding);
				instellingen.add(perDag);
				instellingen.add(perWeek);
				instellingen.add(perMaand);

				service.updateGebruikerInstelling(instellingen, new AsyncCallback<Boolean>() {
					public void onFailure(Throwable caught) {
						Window.alert("Er ging iets fout tijdens het opslaan van de gegevens. Probeer het later nog een keer.");
						log.info("Service failure -> updateGebruikerInstelling(" + instellingen + ") -> " + caught.getMessage());
					}

					public void onSuccess(Boolean result) {
						if (result) {
							Window.alert("De instellingen zijn opgeslagen.");
						} else {
							Window.alert("Er ging iets fout tijdens het opslaan van de gegevens. Probeer het later nog een keer.");
						}
						new GebruikerInstellingWijzigen();
					}
				});
			}
		});
		// Op het panel plaatsen
		flxTable.setWidget(row, 0, btnSubmit);

		// Header table
		RootPanel.get("content").add(flxTableHeader);
				
		// Data table
		RootPanel.get("content").add(flxTable);
				
		Abcensys.setLoadingImage(false);
	}
}
